
/**
*这个作为smartList里的一个条,竖的条条
 * 能被拖动，能被点击，能设置自己的目标位置
 * 
 * 事件类型为OnSliderBarMove
*/
package kgame5.kgui.kcomp {
import kgame5.kgui.GP;
import kgame5.kmath.MathDG;
import kgame5.kutil.*;

import flash.display.*;
import flash.events.*;
import flash.geom.*;

public class SmartSliderBarV extends SmartSliderBar{
	public static var MINMAP_COLOR:int=0x00ff00;//小地图标志的颜色
	//___________________PROPERTY___________________
	
	//--滚动条的事件
	private var sliderAimY:Number=0;
	private var bSliderDrag:Boolean=false;
	
	private var EH:Number;//在这里EH是双重数据，他也是eyeshot的高度，也是mc_bar的高度
	
	//这个可以把samrtList里的元素画到小地图上
	private var mc_minMap:MovieClip;
	
	private var mc_flag:MovieClip;//就是slider上装饰用的小条
	//___________________METHOD______________________
	
	public function SmartSliderBarV(p_mc:MovieClip,p_EH:Number){
		super(p_mc);
		
		//--
		EH=p_EH;
		mc_bar.height=EH;
		if(mc_sb.stage==null){
			mc_sb.addEventListener(Event.ADDED_TO_STAGE,addToStageHandler,false,0,true);
		}else{
			addToStageHandler(null);
		}
		//--是否要画小地图
		mc_minMap=mc_sb.mc_minMap;
		
		mc_flag=mc_sb.mc_flag;
	}
	override public function clear(){
		mc_slider.y=0;
		sliderAimY=0;
		
		preP=-1;
	
		mc_slider.stopDrag();
		
		//--
		if(mc_minMap!=null){
			mc_minMap.graphics.clear();
		}
	}
	//直接设置目标,!!注意这个的原则是杂拖拽过程中，其实是要以拖拽为主的，用户输入优先
	//!!注意设置的是0~1
	override public function setPercent(p:Number){
		sliderAimY=mc_bar.height*p;
		preP=-1;//需要刷新一下呢
	}
	//返回百分比,0~1
	override public function getPercent():Number{
		var p:Number= mc_slider.y/mc_bar.height;
		return p;
	}
	//有添加删除元素的时候要更改高度
	//!!注意这个还不完善，在添加删除条目的时候滚动条的高度是要变的
	override public function changeSliderHeight (eH : Number, mapH : Number,aListItem:Array){
		//判断是否要显示滚动条
		if(mapH>eH){//装不下了需要滚动的时候再显示滚动条
			mc_sb.visible=true;
		}else{//能装下的时候不使用滚动条
			mc_sb.visible=false;
			return;
		}
		
		//设置slider的高度
		if(mapH>0){//这个是防止除数为0用的
			mc_slider.height = mc_bar.height*(eH / mapH);
		}else{
			mc_slider.height=mc_bar.height;
		}
		mc_slider.height = MathDG.Clamp(mc_slider.height, 0, mc_bar.height);
		
		//--如果是在拖动中改变了高度，需要重新设置一下
		if(this.bSliderDrag){
			mc_slider.stopDrag();
			mc_slider.startDrag(false,new Rectangle(0,0,0,mc_bar.height-mc_slider.height));
		}
		
		//--把smartList里各个条目画到mc_bar上做水印
		if(mc_minMap!=null){
			
			mc_minMap.graphics.clear();
			
			var myMapH:Number=mapH;
			if(myMapH<eH){
				myMapH=eH;
			}
			var scale:Number=eH/myMapH;
			
			for(var i:int=0;i<aListItem.length;i++){
				var mc_item:MovieClip=aListItem[i];
				
				//--取得y
				var itemY:Number=0;
				for(var j:int=0;j<i;j++){
					itemY+=SmartListX.GetItemHeight(aListItem[j]);
				}
				
				var y:Number=itemY*scale;
				
				//--取得height
				var height:Number=SmartListX.GetItemHeight(mc_item)*scale-2;
				
				//--画小标志
				GP.drawRect(mc_minMap.graphics, MINMAP_COLOR, 0, y, mc_minMap.width, height);
				
			}
		}
	}
	
	//=====================
	private function addToStageHandler(e:Event){
		
		//--efh
		mc_sb.addEventListener(Event.ENTER_FRAME,enterFrameHandler,false,0,true);
		
		//--slider
		mc_slider.addEventListener(MouseEvent.MOUSE_DOWN,mouseDownHandler_slider,false,0,true);
		//注意在没加入到stage之前这个的stage是空的!!
		mc_slider.stage.addEventListener(MouseEvent.MOUSE_UP,mouseUpHandler_slider,false,0,true);
		//mc_slider.addEventListener(MouseEvent.MOUSE_OUT,mouseUpHandler_slider);
		
		//--bar
		mc_bar.addEventListener(MouseEvent.MOUSE_DOWN,mouseDownHandler_bar,false,0,true);
		//--minMap被点的事件
		if(mc_minMap!=null){
			mc_minMap.addEventListener(MouseEvent.MOUSE_DOWN,mouseDownHandler_minMap,false,0,true);
		}
	}
	
	private var preP:Number=-1;
	private function enterFrameHandler(e:Event){
		if(bSliderDrag==false){//没有拖动的时候使用缓动
			sliderAimY=MathDG.Clamp(sliderAimY,0,mc_bar.height-mc_slider.height);
			mc_slider.y = MathDG.Spring3 (mc_slider.y, sliderAimY, 3);
			
			//~~mend 的小标志,显示用的
			if(mc_flag!=null){
				mc_flag.y=mc_slider.y+mc_slider.height/2;
			}
		}
		
		//
		var p:Number=this.getPercent();
		if(preP!=p){
			preP=p;
			var ke:Event=new KEvent(SmartSliderBar.EVENTTYPE_SLIDERMOVE,null);
			this.dispatchEvent(ke);
		}
	}
	
	
	//-------------滚地图的模块
	private function mouseDownHandler_slider(e:MouseEvent){
		//T.p("鼠标按下，启动拖拽");
		mc_slider.startDrag(false,new Rectangle(0,0,0,mc_bar.height-mc_slider.height));
		bSliderDrag=true;
		
		//--
		mc_slider.addEventListener(MouseEvent.MOUSE_MOVE,mouseMoveHandler_slider,false,0,true);
	}
	
	//这个是要检测全局的鼠标抬起，否则如果是在smartList之外鼠标抬起，则不会得到抬起事件
	private function mouseUpHandler_slider(e:MouseEvent){
		if(bSliderDrag==false){//不在拖拽中的就不处理了
			return;
		}
		//T.p("鼠标抬起，关闭拖拽");
		mc_slider.stopDrag();
		bSliderDrag=false;
		
		//--这个是为了在鼠标抬起的时候mc_slider能在正确的位置 
		sliderAimY=this.mc_slider.y;
		this.mc_slider.y=sliderAimY;
		//--
		mc_slider.removeEventListener(MouseEvent.MOUSE_MOVE,mouseMoveHandler_slider);
		
	}
	private function mouseMoveHandler_slider(e:MouseEvent){
		sliderAimY=this.mc_slider.y;
		
		//~~mend 的小标志,显示用的
		if(mc_flag!=null){
				mc_flag.y=mc_slider.y+mc_slider.height/2;
		}
		//e.updateAfterEvent();
	}
	
	private function mouseDownHandler_bar(e:MouseEvent){
		//trace("鼠标点击");
		sliderAimY=e.localY*mc_bar.scaleY;
	}
	
	private function mouseDownHandler_minMap(e:MouseEvent){
		//trace("鼠标点击");
		sliderAimY=e.localY;
	}
}//end of class
}